#ifndef AT_COMMAND_PARSER_H
#define AT_COMMAND_PARSER_H

#include "serial_port/serial_port.h"
#include <iostream>
#include <thread>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <unordered_map>
#include <functional>
#include <chrono>
#include <deque>
#include <atomic>


class at_cmd_parser 
{
public:
    at_cmd_parser(const std::string& serial_port);
    
    void start();    // 启动AT命令处理器
    void stop();    // 停止AT命令处理器

    // 添加AT命令及其对应的处理函数
    void add_command_handler(const std::string& command, std::function<int(const std::string&)> handler);
    void send_at_cmd(const std::string& command);    // 发送AT命令

private:
    void sending_thread();    //AT指令发送线程
    void receiving_thread();    //AT指令回复接收线程
    void processing_thread();    //AT指令回复数据处理线程

    // 命令结构
    struct at_command {
        std::string command;
        unsigned int retries;
        std::chrono::steady_clock::time_point last_send_time;
    };

    // 线程控制
    std::atomic<bool> running;
    std::thread send_thread, recv_thread, process_thread;

    serial_port serial;    // 串口对象

    std::deque<at_command> send_queue;     //发送队列
    std::deque<std::string> recv_queue;    //接收队列

    std::mutex send_mtx, recv_mtx;    //发送和接收互斥锁
    std::condition_variable send_cv, recv_cv;    //发送和接收的条件变量

    // AT 命令与处理函数的映射
    std::unordered_map<std::string, std::function<int(const std::string&)>> command_handler;

    // 发送和接收数据的超时设置
    unsigned int timeout_ms = 1000;
    unsigned int max_retries = 3;

};

#endif // AT_COMMAND_PARSER_H
